package edu.aysf.service.impl;

/*
 * @Author 郑老师
 * @Version: 1.0
 * @Desc
 * @Date 2024-12-07 15:42
 * @Update
 */
//@Service
//@Slf4j
//public class OrderServiceImplBackup implements OrderService{
//    //    @Resource
//    @Autowired
//    private  OrderDao orderDao;
//    // feign 接口调用
//    @Autowired
//    private  AccountServiceFeign accountServiceFeign;
//    // feign 接口调用
//    @Autowired
//    private  StorageServiceFeign storageServiceFeign;
//
////    public OrderServiceImpl(OrderDao orderDao, AccountServiceFeign accountServiceFeign, StorageServiceFeign storageServiceFeign) {
////        this.orderDao = orderDao;
////        this.accountServiceFeign = accountServiceFeign;
////        this.storageServiceFeign = storageServiceFeign;
////    }
//
////    @Autowired
////    private User userClient;
////
////   变成sentinel可以监控的资源，默认只监控控制层
//    // sentinel默认会将controller方法做context整合，导致链路模式的流控失效。
//    // 只需关闭context整合即可：spring.cloud.sentinel.web-context-unify=false
//    @SentinelResource("goods")
//    public void queryGoods(){
//        System.err.println("查询商品");
//    }
//
//    // 创建订单  下面注解添加在发起全局事务的入口方法，相当于用TM(全局事务管理)代理这个方法。
//    // 方法中每个参与的微服务都是一个分支事务(RM)
//    // 问题：如果分布式事务中有超过2个微服务，则需要分开成不同的函数，
//    // 都需加上 @GlobalTransactional(name="create-order", rollbackFor=Exception.class)
////    @GlobalTransactional
//    @GlobalTransactional(name="create-order", rollbackFor=Exception.class)
//    @Override
//    public int createOrder(int id, int user_id, int goods_id, int count, float money) {
//        // 1、创建订单-----------------
//        int i = orderDao.createOrder(id, user_id, goods_id, count, money);
//        System.out.println("创建订单成功");
//
//        // 减库存
//        reduceStorage(goods_id,count);
//
//        // 减余额
//        reduceAccount(user_id,money);
//
//        return i;
//    }
//
//    // 减商品库存
//    @GlobalTransactional(name="create-order", rollbackFor=Exception.class)
//    // 对应的是apm-toolkit-trace这个依赖
//    @Trace
//    private void reduceStorage(int goods_id , int count){
//        try {
//            // 3、减少库存 goods_count----------------------------
//            // 订单数量
//            int order_count = count;
//            // 库存数量
//            int storage_count = storageServiceFeign.selectCount(goods_id);
//            int update_count = storage_count - order_count;
//            // 手工抛出异常，触发rollback
//            if(update_count<0)
//                throw new RuntimeException("库存不足，无法进行扣减操作");
//
//            HashMap storage_map = new HashMap();
//            // 需要查看被调用的方法updateStorage来确定key
//            storage_map.put("goods_id", goods_id);
//            storage_map.put("goods_count", update_count);
//            int k = storageServiceFeign.updateStorage(storage_map);
//            System.out.println("减少账户金额成功");
//        } catch (FeignException e) {
//            log.error("下单失败。原因：{}",e.contentUTF8(),e);
//            throw new RuntimeException(e.contentUTF8(),e);
//        }
//    }
//
//    // 减少账户金额
//    @GlobalTransactional(name="create-order", rollbackFor=Exception.class)
//    @Trace
//    private void reduceAccount(int user_id, float money){
//        try {
//            // 2、减少账户金额 user_money----------------
//            // 订单金额
//            float order_money = money;
//            // 账户金额，查询账户表获得
//            // 或根据账户id
//            float account_money = accountServiceFeign.selectMoney(user_id);
//            // 账户余额减去订单金额
//            float update_money = account_money - order_money;
//            // 余额不够
//            if(update_money<0) {
////                System.out.println("账户余额不足，无法进行扣减操作");
//                throw new RuntimeException("账户余额不足，无法进行扣减操作");
//            }
//
//            HashMap account_map = new HashMap();
//            // 需要查看被调用的方法updateAccount来确定key
//            account_map.put("user_id", user_id);
//            account_map.put("user_money", update_money);
//            int j = accountServiceFeign.updateAccount(account_map);
//            System.out.println("减少账户金额成功");
//        } catch (FeignException e) { // 微服务调用失败时触发FeignException
//            log.error("下单失败。原因：{}",e.contentUTF8(),e);
//            throw new RuntimeException(e.contentUTF8(),e);
//        }
//    }
//
//    // 查询订单
//    @Override
//    public List<OrderEntity> selectOrder(int id) {
//        return orderDao.selectOrder(id);
//    }

//    public Order queryOrderById(Long orderId){
//        //1、查询订单
//        Order order = orderMapper.findById(orderId);
//        //2、用feign远程调用
//        User user = userClient.findById(order.getUserId());
//        //3、封装user到order
//        order.setUser(user);
//        //4、返回
//        return order;
//    }

//}
